const logger = require('../utils/logger')
const { ApiError } = require('../utils/error')

// 异步错误处理包装器
exports.asyncHandler = fn => (req, res, next) => {
  return Promise.resolve(fn(req, res, next))
    .catch(next)
}

// 错误处理中间件
exports.errorHandler = (err, req, res, next) => {
  // 如果是自定义API错误，直接返回
  if (err instanceof ApiError) {
    return res.status(err.statusCode || 400).json({
      code: err.statusCode || 400,
      message: err.message
    })
  }

  // 如果是文件上传相关的错误
  if (req.path === '/api/upload/file') {
    // 处理文件大小超出限制的错误
    if (err.code === 'LIMIT_FILE_SIZE') {
      return res.status(413).json({
        code: 413,
        message: '文件大小超出限制'
      })
    }
    
    // 处理文件类型错误
    if (err.code === 'LIMIT_FILE_TYPE') {
      return res.status(415).json({
        code: 415,
        message: '不支持的文件类型'
      })
    }

    // 处理文件系统错误
    if (err.code === 'EACCES' || err.code === 'ENOSPC' || err.code === 'ENOENT') {
      return res.status(400).json({
        code: 400,
        message: err.message || '文件上传失败'
      })
    }

    // 其他文件上传错误
    return res.status(400).json({
      code: 400,
      message: err.message || '文件上传失败'
    })
  }

  // 其他未知错误，记录日志
  logger.error('Unhandled error:', {
    error: err,
    path: req.path,
    method: req.method,
    body: req.body,
    query: req.query,
    params: req.params
  })
  
  // 开发环境返回详细错误信息，生产环境返回通用错误信息
  const message = process.env.NODE_ENV === 'development' 
    ? `服务器错误: ${err.message}`
    : '服务器内部错误'
  
  res.status(500).json({
    code: 500,
    message
  })
} 